package gitlet;

import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
import javax.swing.JScrollPane;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 陈恒康
 * @Description FileMenu类是JMenu的子类，用于创建一个包含多个菜单项的菜单。
 * @date 2023/12/23
 */
public class FileMenu extends JMenu {
    /**
     * @param repository 与菜单项相关联的仓库对象
     * @Description 构造一个新的FileMenu对象。该对象包含"Add"、"Remove"、"Commit"和"Reset"四个菜单项。
     */
    public FileMenu(Repository repository) {
        super("File");
        JMenuItem commit = new JMenuItem("Commit");
        JMenuItem reset = new JMenuItem("Reset");
        JMenuItem add = new JMenuItem("Add");
        JMenuItem rm = new JMenuItem("Remove");
        this.add(add);
        this.add(rm);
        this.add(commit);
        this.add(reset);
        /**
         * @Description 这个方法为提交按钮添加了一个ActionListener。它提示用户输入提交的消息。如果输入为空或为空，它将显示错误消息。否则，它将输入提交为空描述。
         * @author 陈恒康
         * @date 2023/12/20
         */
        commit.addActionListener(e -> {
            String input = JOptionPane.showInputDialog("请输入Message");
            if (input == null || input.isEmpty()) {
                JOptionPane.showMessageDialog(null, "请输入Message!", "提示信息:", JOptionPane.ERROR_MESSAGE);
                return;
            }
            repository.commit(input, "");
        });
        /**
         * @Description 这个方法为重置按钮添加了一个ActionListener。它显示所有提交消息和ID的列表供用户选择。如果没有选择ID，它将显示错误消息。否则，它将仓库重置为所选提交的状态。
         * @author 陈恒康
         * @date 2023/12/20
         */
        reset.addActionListener(e -> {
            List<String> commitsList = repository.getAllCommitMsgId();
            JList<String> list = new JList<>(commitsList.toArray(new String[]{}));
            list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
            JOptionPane.showMessageDialog(null, new JScrollPane(list), "请选择ID", JOptionPane.PLAIN_MESSAGE);
            java.util.List<String> selectedFiles = list.getSelectedValuesList();
            if (selectedFiles == null || selectedFiles.isEmpty()) {
                JOptionPane.showMessageDialog(null, "请选择ID!", "提示信息:", JOptionPane.ERROR_MESSAGE);
                return;
            }
            for (String file : selectedFiles)
                repository.reset(file.substring(file.lastIndexOf(": ") + 2));
        });
        /**
         * @Description 这个方法为添加按钮添加了一个ActionListener。它显示所有未跟踪和修改的文件的列表供用户选择。如果没有选择文件，它将显示错误消息。否则，它将将所选文件添加到仓库。
         * @author 陈恒康
         * @date 2023/12/20
         */
        add.addActionListener(e -> {
            List<String> ToAddFiles = new ArrayList<>();
            List<String> toAddFiles = new ArrayList<>();
            ToAddFiles.addAll(repository.getUntrackedFiles());
            ToAddFiles.addAll(repository.getModifiedFiles());
            for (String file : ToAddFiles) {
                if (file.contains(" (已变动)"))
                    toAddFiles.add(file.replace(" (已变动)", ""));
                else if (file.contains(" (已删除)"))
                    continue;
                else
                    toAddFiles.add(file);
            }
            if (toAddFiles == null || toAddFiles.isEmpty())
                JOptionPane.showMessageDialog(null, "无待添加文件！", "提示信息:", JOptionPane.ERROR_MESSAGE);
            else {
                JList<String> list = new JList<>(toAddFiles.toArray(new String[]{}));
                list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                JOptionPane.showMessageDialog(null, new JScrollPane(list), "请选择文件", JOptionPane.PLAIN_MESSAGE);
                java.util.List<String> selectedFiles = list.getSelectedValuesList();
                for (String file : selectedFiles) {
                    // System.out.println("选择的文件: " + file);
                    repository.add(file);
                }
            }
        });
        /**
         * @Description 这个方法为rm按钮添加了一个ActionListener。它显示当前阶段中所有文件的列表供用户选择。如果没有选择文件，它将显示错误消息。否则，它将从仓库中删除所选文件。
         * @author 陈恒康
         * @date 2023/12/20
         */
        rm.addActionListener(e -> {
            List<String> toRemoveFiles = new ArrayList<>(repository.getCurrenntStage().getFileToBlob().keySet());
            for (String file : repository.getModifiedFiles()) {
                if (file.contains(" (已删除)"))
                    toRemoveFiles.add(file.replace(" (已删除)", ""));
            }
            if (toRemoveFiles == null || toRemoveFiles.isEmpty())
                JOptionPane.showMessageDialog(null, "无待删除文件！", "提示信息:", JOptionPane.ERROR_MESSAGE);
            else {
                JList<String> list = new JList<>(toRemoveFiles.toArray(new String[]{}));
                list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
                JOptionPane.showMessageDialog(null, new JScrollPane(list), "请选择文件", JOptionPane.PLAIN_MESSAGE);
                java.util.List<String> selectedFiles = list.getSelectedValuesList();
                for (String file : selectedFiles) {
                    // System.out.println("选择的文件: " + file);
                    repository.remove(file);
                }
            }
        });
    }
}